package com.dx.core.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 基礎servlet 所有的繼承這個servlet
 */
public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.这里获取URL或者URI都可以，URI: /lemonfish/UserServlet/login    URL: http://localhost/lemonfish/UserServlet/login
        String requestURI=request.getRequestURI();
        //2.  获取最后`/`的索引
        int beginIndex=requestURI.lastIndexOf("/");
        //3. . 使用substring，获取方法名称
        String methodName=requestURI.substring(beginIndex+1);

        try {
            /**
             *  记住谁调用了“service”方法，this就是谁，
             *  因为我们自己编写的UserServlet继承了BaseServlet
             *  因此，这个service方法也是属于UserServlet的
             *  而前端访问的是UserServlet
             *  因此 this 是 UserServlet的一个对象
             *   4. 这里 根据 方法名称 和 方法参数的class类型 ，利用反射获取UserServlet的该方法。
             */
            Method method=this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
            //5. 使用this调用该方法。
            method.invoke(this,request,response);
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }
}
